import BuffBase, { IBuffDataType } from '../Buff/BuffBase';
import { IBaseDataType } from '../Type/CommonType';
/*
 * @features: 技能控制基类
 * @description: 对于一个卡牌或角色的基类控制
 * @Date: 2020-08-12 23:29:09
 * @Author: judu233(769471424@qq.com)
 * @LastEditTime: 2021-09-12 15:41:19
 * @LastEditors: judu233
 */

import CardBase from "../Card/CardBase";
import BuffManager from '../Manager/BuffManager';

/**冷却类型 */
export enum EFrozen {
    /**回合类型 */
    round = `round`,
    /**全局类型 */
    global = `global`,
    /**计时 */
    timeOut = `timeOut`,
    /**次数 */
    timeCount = `timeCount`,
}
/**冷却时间接口 */
export interface ISkillFrozenType {
    /**冷却类型 */
    type: EFrozen;
    /**次数，计时，回合都是number 全局分为计时和次数 */
    value: number | ISkillFrozenType;
}
/**技能数据接口 */
export interface ISkillDataType extends IBaseDataType {
    /**buff  列表 */
    buffData: IBuffDataType[];
    /**使用次数 */
    useCount: number;
    /**技能等级 */
    level: number;
    /**等级上限 */
    levelHeight: number;

    /**是否可以使用此技能 */
    isCanUse: boolean;
    /**是否可以升级 */
    isCanLevelUp: boolean;
    /**是否正在冷却 */
    isFrozen: boolean;

    /**冷却信息 */
    frozen: ISkillFrozenType;
}

/**  
    * @Title : 技能类
    * @Description : 类说明
 **/
export default class SkillBase {
    /**技能数据 */
    public data: ISkillDataType;

    /**使用者 */
    public useCard: CardBase;
    /**被使用者列表 */
    public targetMap: Map<string, CardBase> = new Map();

    /**buffManager */
    public buffManager: BuffManager = new BuffManager();

    /**初始化技能数据 */
    public initSkillData() {
        //根据data数据创建buff
        let buffTypeList = this.data.buffData;
        try {
            let buffList: BuffBase[] = [];
            //创建Buff
            for (let buffType of buffTypeList) {
                let buffClassName: { new(): BuffBase; } = eval(buffType.type);
                let buff = new buffClassName();
                buffList.push(buff);
            }
            //添加到buff管理器中
            this.buffManager.initBuffManager(buffList);
        } catch (error) {
            cc.error(`技能创建buff失败，信息:${error}`);
        }
    }

    /**使用技能，子类负责实现*/
    public useSkill() { }
}
